package com.hoko.blur.filter;

import ohos.media.image.PixelMap;

import com.hoko.blur.HokoBlur;
import com.hoko.blur.anno.Direction;
import com.hoko.blur.anno.Mode;

/**
 * 本机模糊滤波器
 *
 * @since 2021/08/03
 */
public class NativeBlurFilter {

    /**
     * 做模糊
     *
     * @param mode 模式
     * @param bitmap 位图
     * @param radius 半径
     * @param cores 核
     * @param index 指数
     * @param direction 方向
     */
    public static void doBlur(@Mode int mode, PixelMap bitmap, int radius, int cores, int index, @Direction int direction) {
        switch (mode) {
            case HokoBlur.MODE_BOX:
                nativeBoxBlur(bitmap, radius, cores, index, direction);
                break;
            case HokoBlur.MODE_STACK:
                nativeStackBlur(bitmap, radius, cores, index, direction);
                break;
            case HokoBlur.MODE_GAUSSIAN:
                nativeGaussianBlur(bitmap, radius, cores, index, direction);
                break;
        }
    }

    /**
     * 做完整的模糊
     *
     * @param mode 模式
     * @param bitmap 位图
     * @param radius 半径
     */
    public static void doFullBlur(@Mode int mode, PixelMap bitmap, int radius) {
        doBlur(mode, bitmap, radius, 1, 0, HokoBlur.HORIZONTAL);
        doBlur(mode, bitmap, radius, 1, 0, HokoBlur.VERTICAL);
    }

    /**
     * 本机框模糊
     *
     * @param bitmap 位图
     * @param radius 半径
     * @param cores 核
     * @param index 指数
     * @param direction 方向
     */
    private static native void nativeBoxBlur(PixelMap bitmap, int radius, int cores, int index, int direction);

    /**
     * 本地堆栈模糊
     *
     * @param bitmap 位图
     * @param radius 半径
     * @param cores 核
     * @param index 指数
     * @param direction 方向
     */
    private static native void nativeStackBlur(PixelMap bitmap, int radius, int cores, int index, int direction);

    /**
     * 本机高斯模糊
     *
     * @param bitmap 位图
     * @param radius 半径
     * @param cores 核
     * @param index 指数
     * @param direction 方向
     */
    private static native void nativeGaussianBlur(PixelMap bitmap, int radius, int cores, int index, int direction);

}
